const {createUser, getUserInfo, updateUserInfo, getUserList} = require('../service/user.service');
const {createLog} = require('../service/log.service');

const {registerError, loginError, updateError, databaseError} = require('../constant/err.type');
const {JWT_SECRET} = require('../config/config.default');

const jwt = require('jsonwebtoken');

class UserController {
    async register(ctx, next) {
        let {mobile, user_name, password, profile, time_ban} = ctx.request.body;
        // 操作数据库
        try {
            let res = await createUser(mobile, user_name, password, profile, time_ban);
            if (res) {
                // 记录日志
                await createLog(ctx, `用户注册成功，用户名：${user_name}`);
                ctx.body = {
                    code: 1,
                    message: '用户注册成功！',
                    result: {
                        id: res.id,
                        user_name: res.user_name
                    }
                };
            } else {
                ctx.app.emit('error', registerError, ctx)
            }

        } catch (e) {
            ctx.app.emit('error', registerError, ctx)
        }

    }

    async login(ctx, next) {

        let {user_name, password} = ctx.request.body;
        // 获取用户信息（在token的载荷中需要记录用户的信息）
        try {
            // 剔除 password
            let res = await getUserInfo({user_name});
            let {password, ...userInfo} = res.dataValues;
            // 根据用户信息、密钥、有效日期生成用户token
            let token = jwt.sign(userInfo, JWT_SECRET, {expiresIn: '1h'});

            ctx.body = {
                code: 1,
                message: '登录成功！',
                userInfo: userInfo,
                token: token
            }

        } catch (e) {
            ctx.app.emit('error', loginError, ctx);
        }
    }

    async updatePassword(ctx, next) {

        // 获取数据
        let id = ctx.state.user.id;
        let password = ctx.request.body.password;
        // 操作数据库
        try {
            let res = await updateUserInfo({id, password});
            if (res) {
                // 记录日志
                await createLog(ctx, `修改密码成功，用户ID：${id}`);
                ctx.body = {
                    code: 1,
                    message: '密码修改成功！',
                }
            } else {
                ctx.app.emit('error', updateError, ctx);
            }
        } catch (e) {
            ctx.app.emit('error', updateError, ctx);
        }
        ctx.body = {
            code: 1,
            message: '修改密码成功！',
        }
    }


    /**
     * 查用户列表
     * @param ctx
     * @param next
     * @returns {Promise<void>}
     */
    async getUserList(ctx, next) {

        // 获取数据
        let {id, user_name, is_admin, pageInfo} = ctx.request.query;
        // 操作数据库
        try {
            let res = await getUserList({id, user_name, is_admin, pageInfo});
            if (res) {
                ctx.body = {
                    code: 1,
                    message: '用户列表查询成功！',
                    data: res
                }
            } else {
                ctx.app.emit('error', databaseError, ctx);
            }
        } catch (e) {
            ctx.app.emit('error', databaseError, ctx);
        }
    }

    /**
     * 修改用户
     * @param ctx
     * @param next
     * @returns {Promise<void>}
     */

    async updateUser(ctx, next) {

        // 获取数据
        let {id, user_name, is_admin, profile} = ctx.request.body;
        // 操作数据库
        try {
            let res = await updateUserInfo({id, user_name, is_admin, profile});
            if (res) {
                // 记录日志
                await createLog(ctx, `修改用户信息：${user_name}`);
                ctx.body = {
                    code: 1,
                    message: '用户修改成功！',
                }
            } else {
                ctx.app.emit('error', updateError, ctx);
            }
        } catch (e) {
            ctx.app.emit('error', updateError, ctx);
        }
    }


}

module.exports = new UserController();